#ifndef _PROFIL_H_
#define _PROFIL_

/** @brief File brief description
    Le fichier Profil.h contient tous les renseignements concernant le joueur et son
    évolution dans le jeu*/


/** @brief Le profil d'un joueur comporte son pseudo (une chaine de caractères), un pointeur sur
    le heros, deux indices correspondant au dernier niveau déverouillé par le joueur et au niveau suivant ainsi que le score 
    total du joueur et la difficulté*/
typedef struct 
{
    char* pseudo_joueur;
    int i_pniveau_actuel_joueur;
    int i_pniveau_suivant_joueur;
    int score_joueur;
    int difficulte;
	
} Profil;


/** @brief Cette procédure initialise un profil avec les données passées en paramètres
 *  @param [in,out] pprofil
 *  @param [in] pseudo
 *  @param [in] i_pniveau_actuel
 *  @param [in] i_pniveau_suivant
 *  @param [in] score
 *  @param [in] difficult
 *  @return none*/
void initProfil (Profil* pprofil, char* pseudo, int i_pniveau_actuel ,const int i_pniveau_suivant,
		 const int score, const int difficult);


/** @brief Cette fonction  réserve dans le tas l'espace nécessaire pour un profil,
 *  l'initialise et retourne un pointeur sur le profil crée
 *  @param [in] pseudo
 *  @param [in] i_pniveau_actuel
 *  @param [in] i_pniveau_suivant
 *  @param [in] score
 *  @param [in] difficult
 *  @return none*/
Profil* creerProfil (char* pseudo, int i_pniveau_actuel ,const int i_pniveau_suivant, 
		     const int score, const int difficult);


/** @brief Cette procédure libère l'espace mémoire alloué dans le tas pour un profil
 *  @param [in,out] ppprofil
 *  @return none*/
void detruireProfil (Profil** ppprofil);



/** @brief Cette fonction retourne le pseudo d'un joueur 
 *  @param [in,out] pprofil
 *  @return char* pseudo_profil */
char* getPseudoProfil (const Profil* pprofil);


/** @brief Cette procédure permet de changer le pseudo d'un joueur en fournissant
 *une nouvelle valeur en donnee
 *  @param [in,out] pprofil
 *  @param [in] pseudo
 *  @return none */
void setPseudoProfil (Profil* pprofil, char* pseudo);


/** @brief Cette fonction retourne le niveau actuel du joueur, celui qui sera charge si le joueur
désire continuer sa progression dans le jeu 
    @param [in,out] pprofil
 *  @return int i_niveau_actuel */
const int getNiveauActuelProfil (const Profil* pprofil);


/** @brief Cette procédure permet de changer le niveau actuel du joueur en fournissant
 *une nouvelle valeur en donnee
 *  @param [in,out] pprofil
 *  @param [in] i_pniveau_actuel
 *  @return none */
void setNiveauActuelProfil (Profil* pprofil, int i_niveau_actuel);


/** @brief Cette fonction retourne le niveau suivant du joueur, celui qui sera chargé si le joueur
désire continuer sa progression dans le jeu 
    @param [in,out] pprofil
 *  @return int i_niveau_suivant */
const int getNiveauSuivantProfil (const Profil* pprofil);


/** @brief Cette procédure permet de changer le niveau suivant du joueur en fournissant
 *une nouvelle valeur en donnee
 *  @param [in,out] pprofil
 *  @param [in] i_pniveau_suivant
 *  @return none */
void setNiveauSuivantProfil (Profil* pprofil, int i_niveau_suivant);


/** @brief Cette fonction retourne le score total du joueur 
 *  @param [in,out] pprofil
 *  @return int score */
const int getScoreProfil (const Profil* pprofil);


/** @brief Cette procédure permet de changer le score total du joueur en fournissant
 *une nouvelle valeur en donnee
 *  @param [in,out] pprofil
 *  @param [in] score
 *  @return none */
void setScoreProfil (Profil* pprofil, const int score);


/** @brief Cette fonction retourne la difficulté associée au profil 
 *  @param [in,out] pprofil
 *  @return int difficult */
const int getDifficulteProfil (const Profil* pprofil);


/** @brief Cette procédure permet de changer la difficulté associée au profil en fournissant
 *  une nouvelle valeur en donnee
 *  @param [in,out] pprofil
 *  @param [in] difficult
 *  @return none */
void setDifficulteProfil (Profil* pprofil, const int difficult);


/** @brief Cette procédure permet la mise à jour du profil lorsque un niveau est terminé ou si le 
    joueur perd
    @param [in,out] pprofil
 *  @param [in] pseudo
 *  @param [in] num_niveau_actuel
 *  @param [in] num_niveau_suivant
 *  @param [in] score_niveau
 *  @param [in] difficult
 *  @return none*/
void transfererDonneesProfil(Profil* pprofil, char* pseudo,  const int num_niveau_actuel, const int num_niveau_suivant,
			     const int score_niveau, const int difficult);


/** @brief Cette fonction permet de charger les donnéess d'un profil lorsque le joueur reprend une partie
 *  @param [in] nom
 *  @return Profil* */
Profil* chargerProfil (const char* nom);


/** @brief Cette procédure permet de sauver les modifications d'un profil dans un fichier sur le disque dur
 *  @param [in,out] pprofil
 *  @return none*/
void sauvegarderProfil (const Profil* pprofil);


/** @brief On sauvegarde dans un fichier le pseudo courant
 *  @param [in] nom
 *  @return none*/
void sauvegarderNom (char* nom);


/** @brief Etant donne que le fichier contenant un profil a le même nom que le pseudo associé au profil
    cette procédure permet d'identifier le nom du profil courant pour le charger
    @param [in] nom
 *  @return none*/
void chargerNom (char* nom);


#endif
